import { mergeLocalCart, findCartList, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'
// 购物车状态
export default {
  namespaced: true, // 开启模块化
  state: () => ({
    list: []
  }),
  getters: {
    // 选出有效商品
    validList: state => {
      return state.list.filter(item => item.isEffective)
    },
    // 有效商品列表选中商品
    vaildSeled: (state, getters) => {
      return getters.validList.filter(item => item.selected)
    },
    // 选中商品的总价
    valiSeledTotal: (state, getters) => {
      return getters.vaildSeled.reduce((acc, good) => (acc += good.nowPrice * good.count), 0)
    },
    // 有效商品列表是否是全部选中状态
    isAll: (state, getters) => {
      return getters.validList.every(good => good.selected)
    }
  },
  mutations: {
    setlist (state, reslut) {
      state.list = reslut
    },
    /**
     * @param {*} state 获取变量对象
     * @param {*} good  当前加入list商品数据
     */
    // 加入购物车：向list中添加商品
    addCart (state, good) {
      /**
       * 分为两种情况，如果购物车原先就有，加入过，就只是单纯的增加数量
       * 如果没有加入过，就添加到数组中，unshift()
       */
      // 判断 返回的是一个索引
      const addedIndex = state.list.findIndex(item => item.skuId === good.skuId)
      if (addedIndex > -1) {
        // list里面有，只增加数量就行
        state.list[addedIndex].count += good.count
      } else {
        // 没有加入过
        state.list.unshift(good)
      }
    },
    // 购物车单选状态
    singCheck (state, { i, sel }) {
      // 返回一个对象
      const singCheckone = state.list.find(item => item.skuId === i.skuId)
      singCheckone.selected = sel
    },
    // 全选的状态
    allCheck (state, sel) {
      state.list.forEach(item => {
        item.selected = sel
      })
    },
    // 删除
    delChart (state, i) {
      const index = state.list.findIndex(item => item.skuId === i.skuId)
      state.list.splice(index, 1)
    },
    // 商品数量的加减
    addNumber (state, { i, num }) {
      const addnum = state.list.find(item => item.skuId === i.skuId)
      addnum.count = num
    }
  },
  actions: {
    // 获取最新的列表数据
    async getlistAction ({ commit }) {
      const { result } = await findCartList()
      commit('setlist', result)
    },
    /**
     * 登陆成功后合并本地购物车数据到当前登录人名下
     * @param {*} param
     */
    async mergeCartAction ({ commit, state, dispatch }) {
      /**
       * 1.判断本地是否有之前未登录添加的购物车商品数据
       * 2.如果有调用接口进行合并
       * 3.调用接口获取合并后最新的购物车数据（当前登录人）
       */
      if (state.list.length > 0) {
        const merge = state.list.map(({ skuId, selected, count }) => {
          return {
            skuId, selected, count
          }
        })
        await mergeLocalCart(merge)
      }
      // 调用接口获取合并后最新的信息
      dispatch('getlistAction')
    },
    /** 加入购物车
     * 思路：区分是否登录=》1.未登录，直接调用本地2.登陆了调用接口存到数据库
  * rootState可以获取其他模块的state变量
  */
    async addCartAction ({ commit, rootState, dispatch }, payload) {
      if (rootState.user.profile.token) {
        // 登录  调用接口
        await insertCart(payload)
        dispatch('getlistAction')
      } else {
        // 没有登陆
        commit('addCart', payload)
        return '加入购物车成功'
      }
    },
    // 如果未登录，单选在这里调用
    async singCheckAction ({ commit, rootState, dispatch }, { i, sel }) {
      if (rootState.user.profile.token) {
        // 登录  调用接口
        await updateCart({ ...i, selected: sel })
        dispatch('getlistAction')
      } else {
        // 没有登陆
        commit('singCheck', { i, sel })
      }
    },
    // 全选状态
    async allCheckAction ({ commit, rootState, dispatch, getters }, sel) {
      if (rootState.user.profile.token) {
        // 登录  调用接口
        const ids = getters.validList.map(item => item.skuId)
        await checkAllCart({ selected: sel, ids })
        dispatch('getlistAction')
      } else {
        // 没有登陆
        commit('allCheck', sel)
      }
    },
    // 删除
    async delChartAction ({ commit, rootState, dispatch }, i) {
      if (rootState.user.profile.token) {
        // 登录  调用接口
        await deleteCart([i.skuId])
        dispatch('getlistAction')
      } else {
        // 没有登陆
        commit('delChart', i)
      }
    },
    // 商品数量的加减
    async addNumberAction ({ commit, rootState, dispatch }, { i, num }) {
      if (rootState.user.profile.token) {
        // 登录  调用接口
        await updateCart({ ...i, count: num })
        dispatch('getlistAction')
      } else {
        // 没有登陆
        commit('addNumber', { i, num })
      }
    }
  }
}
